/*
 * File Name:               XAsyncEntity.cs
 * 
 * Description:             普通类
 * Author:                  lisiyu
 * Create Date:             2016/06/29
 */

//
// 摘要:
//     处理异步方案中带有返回值的情况
//     
// 思路:
//     先使用一个默认值放在那里,有完成值之后替换回来
//
// 限制:
//     仅能用于可以使用临时替代资源的地方
public class XAsyncEntity<T>
{
    public delegate XProperty<T> AsyncDefault<K>();
    public delegate T AsyncHandle<K>();

    XProperty<T> mProperty;
    AsyncHandle<T> mOnHandle;

    private XAsyncEntity()
    {

    }

    //
    // 摘要:
    //     在支线程内完成替换操作
    //
    // 参数:
    //     onHandle: 替换操作
    //     onDefault: 默认情况
    // 
    // 返回结果:
    //     XProperty包装下的资源
    public static XProperty<T> runAsync(AsyncHandle<T> onHandle, AsyncDefault<T> onDefault)
    {
        var ret = onDefault();
        new XAsyncEntity<T>()
        {
            mProperty = ret,
            mOnHandle = onHandle,
        }.runAsync();
        return ret;
    }

    //
    // 摘要:
    //     在主线程中完成替换操作
    //
    // 参数:
    //     onHandle: 替换操作
    //     onDefault: 默认情况
    // 
    // 返回结果:
    //     XProperty包装下的资源
    public static XProperty<T> runSync(AsyncHandle<T> onHandle, AsyncDefault<T> onDefault)
    {
        var ret = onDefault();
        new XAsyncEntity<T>()
        {
            mProperty = ret,
            mOnHandle = onHandle,
        }.runSync();
        return ret;
    }


    private void runAsync()
    {
        XAsyncUtils.runAsync(() =>
        {
            T tmp = mOnHandle();
            mProperty.setProperty(tmp);
        });
    }

    private void runSync()
    {
        XAsyncUtils.runAsync(() =>
        {
            T tmp = mOnHandle();
            XAsyncUtils.runSync(() =>
            {
                mProperty.setProperty(tmp);
            });
        });
    }
}